package socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/**
 * 聊天室服务端
 */
public class Server {
    /*
        java.net.ServerSocket
        运行在服务端，相当于客服的"总机"，用于接收不同客户端的连接
     */

    private ServerSocket serverSocket;

    public Server(){
        try {
            /*
                实例化ServerSocket时需要指定端口，客户端的Socket就是通过这个端口找到
                ServerSocket并与之连接的

                如果该端口被其他应用程序占用会抛出异常：
                java.net.
                此时需要更换端口再尝试
             */
            System.out.println("正在启动服务器...");
            serverSocket = new ServerSocket(8080);
            System.out.println("服务端启动完毕");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void start(){
        try {
            /*
                ServerSocket有一个重要方法：
                accept()       返回值是Socket
                该方法用于接收客户端的连接，是阻塞方法，调用该方法后不会立即返回，此时会卡住，
                直到一个客户端连接
             */
            while(true) {
                System.out.println("等待客户端连接...");
                Socket socket = serverSocket.accept();
                System.out.println("成功连接一个客户端！");
            /*
                Socket提供的方法：
                InputStream getInputStream()         返回值为InputStream型
                通过Socket 获取一个字节输入流，用于读取发过来的字节数据
             */
                InputStream in = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8);
                BufferedReader br = new BufferedReader(isr);
                String line;
            /*
                readLine方法用于读取来自客户端发送过来的一行字符串、
                该方法有以下几种现象：
                1.正常返回一行字符串，正常读取；
                2.返回null，说明客户端进行了四次挥手与服务端断开链接，不会再返送数据了
                3.抛出异常，客户端没有进行四次挥手而异常断开
             */
                while ((line = br.readLine()) != null) {
                    System.out.println("客户端说：" + line);
                }
                //int d = in.read();//读取对方发送过来的一个字节
                //System.out.println(d);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Server server = new Server();
        server.start();
    }
}
